/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core.explorer;

import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import myftp.app.model.FileModel;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 * Comparateur de fichier
 */
public class FileComparator implements Comparator {

    private int column = 0;
    private boolean ascending = true;

    public FileComparator() {
    }

    public void setColumn(int column) {
        /* Sélection de la colonne a trier */
        if (column == this.column) {
            /* Inversion du tri si la colonne sélectionné a déjà été trié */
            ascending = !ascending;
        } else {
            this.column = column;
            ascending = true;
        }
    }

    public int getColumn() {
        return column;
    }

    public int compare(Object firstObject, Object secondObject) {
        int res = 0;
        FileModel file1 = (FileModel) firstObject;
        FileModel file2 = (FileModel) secondObject;
        switch (column) {
            case 0:
                /* Comparaison de fichier par leur NOMS */
                res = file1.getName().compareTo(file2.getName());
                break;
            case 1:
                /* Comparaison de fichier par leur TAILLES */
                res = compareSizes(file1.getSize(), file2.getSize());
                break;
            case 2:
                /* Comparaison de fichier par leur DATES */
                res = compareDates(file1.getDate(), file2.getDate());
        }

        if (ascending) {
            return res;
        } else {
            return -res;
        }
    }

    public static int compareSizes(String aFirstSize, String aSecondSize) {
        /* Comparaison par les tailles de deux fichiers */

        int firstExp = 0;
        int secondExp = 0;

        /* Récupération des éléments voulus */
        Pattern pattern = Pattern.compile("([^\\p{Space}]+)(.?)(.*?)");
        Matcher firstMatch = pattern.matcher(aFirstSize);
        Matcher secondMatch = pattern.matcher(aSecondSize);

        if (firstMatch.matches() && secondMatch.matches()) {

            /* Pondération des puissance d'octets du premier fichier*/
            if (firstMatch.group(3).startsWith("o")) {
                firstExp = 0;
            } else if (firstMatch.group(3).startsWith("K")) {
                firstExp = 1000;
            } else if (firstMatch.group(3).startsWith("M")) {
                firstExp = 1000000;
            } else if (firstMatch.group(3).startsWith("G")) {
                firstExp = 1000000000;
            }

            /* Pondération des puissance d'octets du second fichier*/
            if (secondMatch.group(3).startsWith("o")) {
                secondExp = 0;
            } else if (secondMatch.group(3).startsWith("K")) {
                secondExp = 1000;
            } else if (secondMatch.group(3).startsWith("M")) {
                secondExp = 1000000000;
            } else if (secondMatch.group(3).startsWith("G")) {
                secondExp = 1000000000;
            }


            /* Comparaison des puissance d'octets si inagales */
            if (firstExp != secondExp) {
                return firstExp - secondExp;
            }

            /* Si puissance d'octets égales, compraison des valeurs directes */
            return firstMatch.group(1).compareTo(secondMatch.group(1));

        }
        return 0;
    }

    public static int compareDates(String aFirstDate, String aSecondDate) {
        /* Comparaison par les dates de deux fichiers */

        int res = 0;
        int firstAttr = 0;
        int secondAttr = 0;

        /* Récupération des éléments voulus */
        Pattern pattern = Pattern.compile(
                "([^\\p{Space}]+)\\p{Space}+"
                + "([^\\p{Space}]+)\\p{Space}+"
                + "([^\\p{Space}]+)\\p{Space}+"
                + "([^\\p{Space}]+)");

        Matcher firstMatch = pattern.matcher(aFirstDate);
        Matcher secondMatch = pattern.matcher(aSecondDate);

        /* Si l'année n'est pas présente (fichiers distants) */
        if (!firstMatch.matches() || !secondMatch.matches()) {

            pattern = Pattern.compile(
                    "([^\\p{Space}]+)\\p{Space}+"
                    + "([^\\p{Space}]+)\\p{Space}+"
                    + "([^\\p{Space}]+)");

            firstMatch = pattern.matcher(aFirstDate);
            secondMatch = pattern.matcher(aSecondDate);
        } else if ((res = firstMatch.group(4).compareTo(secondMatch.group(4))) != 0) {
            return res;
        }

        if (!firstMatch.matches() || !secondMatch.matches()) {
            System.out.println("Erreur de match sur les dates");
            return 0;
        }

        /* Pondération des mois du premier fichier*/
        if (firstMatch.group(2).startsWith("Jan")) {
            firstAttr = 1;
        } else if (firstMatch.group(2).startsWith("Feb")) {
            firstAttr = 2;
        } else if (firstMatch.group(2).startsWith("Mar")) {
            firstAttr = 3;
        } else if (firstMatch.group(2).startsWith("Apr")) {
            firstAttr = 4;
        } else if (firstMatch.group(2).startsWith("May")) {
            firstAttr = 5;
        } else if (firstMatch.group(2).startsWith("Jun")) {
            firstAttr = 6;
        } else if (firstMatch.group(2).startsWith("Jul")) {
            firstAttr = 7;
        } else if (firstMatch.group(2).startsWith("Aug")) {
            firstAttr = 8;
        } else if (firstMatch.group(2).startsWith("Sep")) {
            firstAttr = 9;
        } else if (firstMatch.group(2).startsWith("Oct")) {
            firstAttr = 10;
        } else if (firstMatch.group(2).startsWith("Nov")) {
            firstAttr = 11;
        } else if (firstMatch.group(2).startsWith("Dec")) {
            firstAttr = 12;
        }

        /* Pondération des mois du second fichier*/
        if (secondMatch.group(2).startsWith("Jan")) {
            secondAttr = 1;
        } else if (secondMatch.group(2).startsWith("Feb")) {
            secondAttr = 2;
        } else if (secondMatch.group(2).startsWith("Mar")) {
            secondAttr = 3;
        } else if (secondMatch.group(2).startsWith("Apr")) {
            secondAttr = 4;
        } else if (secondMatch.group(2).startsWith("May")) {
            secondAttr = 5;
        } else if (secondMatch.group(2).startsWith("Jun")) {
            secondAttr = 6;
        } else if (secondMatch.group(2).startsWith("Jul")) {
            secondAttr = 7;
        } else if (secondMatch.group(2).startsWith("Aug")) {
            secondAttr = 8;
        } else if (secondMatch.group(2).startsWith("Sep")) {
            secondAttr = 9;
        } else if (secondMatch.group(2).startsWith("Oct")) {
            secondAttr = 10;
        } else if (secondMatch.group(2).startsWith("Nov")) {
            secondAttr = 11;
        } else if (secondMatch.group(2).startsWith("Dec")) {
            secondAttr = 12;
        }


        /* Comparaison des mois */
        if (firstAttr < secondAttr) {
            return -10;
        }
        if (firstAttr > secondAttr) {
            return 10;
        }


        /* Comparaison des Jours si mois égaux */
        if ((res = firstMatch.group(1).compareTo(secondMatch.group(1))) != 0) {
            return res;
        }


        /* Comparaison des heures si mois et jours égaux */
        if ((res = firstMatch.group(3).compareTo(secondMatch.group(3))) != 0) {
            return res;
        }

        return 0;
    }
}


